Revert "Rework fix for PR19460 - Use explicit bool as an extension instead." This reverts commit 3a1b90a866b6d5d62a5f37fbfb3a1ee36cc70dd1. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@291921 91177308-0d34-0410-b5e6-96231b3b80d8 
diff --git a/include/__config b/include/__config index c108b59..b30b15c 100644 --- a/include/__config +++ b/include/__config 
@@ -772,7 +772,7 @@  #define _NOALIAS  #endif   -#if __has_extension(cxx_explicit_conversions) || defined(__IBMCPP__) || \ +#if __has_feature(cxx_explicit_conversions) || defined(__IBMCPP__) || \  (!defined(_LIBCPP_CXX03_LANG) && defined(__GNUC__)) // All supported GCC versions  # define _LIBCPP_EXPLICIT explicit  #else 
diff --git a/include/experimental/string_view b/include/experimental/string_view index 674f6c3..41c0d34 100644 --- a/include/experimental/string_view +++ b/include/experimental/string_view 
@@ -340,12 +340,7 @@  // [string.view.ops], string operations:  template<class _Allocator>  _LIBCPP_INLINE_VISIBILITY - // Clang's extended C++11 explict conversions don't work with - // string_view in C++03. -#ifndef _LIBCPP_CXX03_LANG - _LIBCPP_EXPLICIT -#endif - operator basic_string<_CharT, _Traits, _Allocator>() const + _LIBCPP_EXPLICIT operator basic_string<_CharT, _Traits, _Allocator>() const  { return basic_string<_CharT, _Traits, _Allocator>( begin(), end()); }    template<class _Allocator = allocator<_CharT> > 
diff --git a/include/ios b/include/ios index efee39f..b05ee4c 100644 --- a/include/ios +++ b/include/ios 
@@ -572,6 +572,13 @@  clear(__rdstate_);  }   +#if defined(_LIBCPP_CXX03_LANG) +struct _LIBCPP_TYPE_VIS_ONLY __cxx03_bool { + typedef void (__cxx03_bool::*__bool_type)(); + void __true_value() {} +}; +#endif +  template <class _CharT, class _Traits>  class _LIBCPP_TEMPLATE_VIS basic_ios  : public ios_base @@ -585,8 +592,18 @@  typedef typename traits_type::pos_type pos_type;  typedef typename traits_type::off_type off_type;   + // __true_value will generate undefined references when linking unless + // we give it internal linkage. + +#if defined(_LIBCPP_CXX03_LANG) + _LIBCPP_ALWAYS_INLINE + operator __cxx03_bool::__bool_type() const { + return !fail() ? &__cxx03_bool::__true_value : nullptr; + } +#else  _LIBCPP_ALWAYS_INLINE  _LIBCPP_EXPLICIT operator bool() const {return !fail();} +#endif    _LIBCPP_ALWAYS_INLINE bool operator!() const {return fail();}  _LIBCPP_ALWAYS_INLINE iostate rdstate() const {return ios_base::rdstate();}